#ifndef ROUNDMENUWIDGET_H
#define ROUNDMENUWIDGET_H

#include <QWidget>
#include <QTimer>
#include <QPropertyAnimation>
#include <QParallelAnimationGroup>
#include <QSequentialAnimationGroup>
#include <QPainter>
#include <QPainterPath>
#include <QMouseEvent>
#include <QPointF>
#include <QPixmap>
#include <QColor>
#include <QFont>
#include <QDebug>
#include <QtMath>

// 按钮大小宏定义
#define BUTTON_SIZE_SCALE 1.5  // 统一的按钮大小比例，值越大按钮越小
#define DRAG_AREA_SCALE 1.0    // 拖动区域半径比例，比按钮稍大

// 菜单项数据结构
struct MenuItemData {
    QString title;
    QString tooltip;
    QPixmap icon;           // 默认图标
    QPixmap hoverIcon;      // 悬停图标
    QPixmap pressedIcon;    // 按下图标
    QColor backgroundColor;
    bool isHovered;
    bool isPressed;
    
    MenuItemData() : isHovered(false), isPressed(false) {}    MenuItemData(const QString& t, const QString& tip, const QPixmap& ico = QPixmap(), 
                const QColor& bg = QColor(), const QPixmap& hoverIco = QPixmap(), 
                const QPixmap& pressedIco = QPixmap())
        : title(t), tooltip(tip), icon(ico), hoverIcon(hoverIco), pressedIcon(pressedIco),
          backgroundColor(bg), isHovered(false), isPressed(false) {}
};

// 渐变颜色数据结构
struct GradientColorData {
    qreal position;
    QColor color;
    
    GradientColorData(qreal pos = 0.0, const QColor& clr = QColor()) 
        : position(pos), color(clr) {}
};

// 菜单样式配置结构
struct MenuStyleConfig {
    // 颜色配置 - 现代化配色方案
    QColor centerButtonColor = QColor(74, 144, 226);        // 蓝色
    QColor centerButtonExpandColor = QColor(52, 152, 219);   // 亮蓝色
    QColor centerButtonHoverColor = QColor(41, 128, 185);    // 深蓝色
    QColor menuBackgroundColor = QColor(255, 255, 255, 20);  // 半透明白色
    QColor menuItemBackgroundColor = QColor(236, 240, 241);  // 浅灰
    QColor menuItemHoverColor = QColor(189, 195, 199);       // 中灰
    QColor menuItemTextColor = QColor(44, 62, 80);           // 深色文字
    QColor menuItemTextHoverColor = QColor(255, 255, 255);   // 白色文字
    QColor borderColor = QColor(189, 195, 199, 100);         // 浅边框
    
    // 尺寸配置 - 使用宏定义统一大小
    qreal outerRadiusScale = 0.75;          // 外圆半径比例
    qreal innerRadiusScale = 0.40;          // 内圆半径比例
    qreal centerButtonScale = BUTTON_SIZE_SCALE;  // 中心按钮大小
    qreal menuItemScale = 2.0;              // 菜单项图标大小比例
    qreal menuItemBgScale = BUTTON_SIZE_SCALE;    // 菜单项背景大小
    qreal borderWidth = 1.0;                // 边框宽度
    qreal roundRadius = 0.5;                // 圆角比例
    qreal startAngle = 180.0;               // 起始绘制角度
      // 动画配置
    uint animationDuration = 400;   // 动画时长    // 显示选项
    bool showBackground = false;     // 显示控件背景
    bool showSeparatorLines = false; // 显示分割线
    bool useRoundMenuItems = true;   // 使用圆形菜单项
    bool showCenterButton = true;    // 显示中心按钮
    bool useRandomColors = false;    // 使用随机颜色
    bool enableRotationAnimation = true; // 启用旋转动画
    bool showBorder = false;         // 显示边框
    bool showFullNameWithoutIcon = true; // 无图标时显示全名
    bool useScatteredLayout = false; // 使用分散布局（类似第一张图的效果）
    bool showCenterButtonInScattered = true; // 在分散布局中显示中心按钮
    
    // 高级效果配置
    bool enableRippleEffect = false;     // 启用波纹效果
    bool enableGlowEffect = false;       // 启用发光效果
    bool enableParticleEffect = false;   // 启用粒子效果
    QColor rippleColor = QColor(255, 255, 255, 100);  // 波纹颜色
    QColor glowColor = QColor(100, 200, 255, 150);    // 发光颜色
    qreal effectIntensity = 1.0;         // 效果强度
    
    // 渐变背景颜色列表
    QList<GradientColorData> gradientColors;
};

class RoundMenuWidget : public QWidget
{
    Q_OBJECT
    Q_PROPERTY(qreal rotationAngle READ rotationAngle WRITE setRotationAngle)
    Q_PROPERTY(qreal expandProgress READ expandProgress WRITE setExpandProgress)
    Q_PROPERTY(qreal gatherProgress READ gatherProgress WRITE setGatherProgress)

public:
    explicit RoundMenuWidget(QWidget *parent = nullptr);
    explicit RoundMenuWidget(bool isPopup, uint centerButtonSize, uint itemType = 0, QWidget *parent = nullptr);
    ~RoundMenuWidget();    // 菜单项管理
    void addMenuItem(const QString& title, const QString& tooltip = QString(), 
                    const QPixmap& icon = QPixmap(), const QColor& backgroundColor = QColor());
    void addMenuItem(const QString& title, const QString& tooltip, 
                    const QPixmap& icon, const QPixmap& hoverIcon, const QPixmap& pressedIcon,
                    const QColor& backgroundColor = QColor());
    // 新增：支持两个图标状态的重载方法（字符串路径版本）
    void addMenuItem(const QString& title, const QString& tooltip, 
                    const QString& iconPath, const QString& hoverIconPath,
                    const QColor& backgroundColor = QColor());
    void addMenuItem(const MenuItemData& item);
    void insertMenuItem(int index, const MenuItemData& item);
    void removeMenuItem(int index);
    void clearMenuItems();
    int menuItemCount() const { return m_menuItems.count(); }

    // 样式配置
    void setMenuStyle(const MenuStyleConfig& style);
    MenuStyleConfig getMenuStyle() const { return m_style; }
    
    // 图标路径设置
    void setExpandIcon(const QString& iconPath);
    void setCollapseIcon(const QString& iconPath);
    QString getExpandIconPath() const { return m_expandImgPath; }
    QString getCollapseIconPath() const { return m_closedImgPath; }    // 状态查询
    bool isExpanded() const { return m_isExpanded; }
    qreal rotationAngle() const { return m_rotationAngle; }
    qreal expandProgress() const { return m_expandProgress; }
    qreal gatherProgress() const { return m_gatherProgress; }
      // 鼠标交互 - 公有方法
    int getMenuItemAtPosition(const QPointF& pos) const;
    bool isPointInCenterButton(const QPointF& pos) const;
    bool isPointInDragArea(const QPointF& pos) const;  // 检查是否在拖动区域

public slots:
    void expandMenu();
    void collapseMenu();
    void toggleMenu();
    void setRotationAngle(qreal angle);
    void setExpandProgress(qreal progress);
    void setGatherProgress(qreal progress);  // 新增聚集进度属性

signals:
    void menuItemClicked(int index);
    void menuExpanded();
    void menuCollapsed();
    void menuToggled(bool expanded);

protected:
    void paintEvent(QPaintEvent *event) override;
    void mousePressEvent(QMouseEvent *event) override;
    void mouseMoveEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
    void leaveEvent(QEvent *event) override;
    void resizeEvent(QResizeEvent *event) override;

private slots:
    void onRotationUpdate();
    void onAnimationFinished();

private:
    void initRoundMenuCtl();
    void initMenuAnimation();
    void updateMenuItemStates();      // 绘制方法
    void drawBackground(QPainter *painter);
    void drawMenuItems(QPainter *painter);
    void drawScatteredMenuItems(QPainter *painter);
    void drawCircularMenuItems(QPainter *painter);
    void drawCenterButton(QPainter *painter);
    void drawSeparatorLines(QPainter *painter);
    void drawDragHint(QPainter *painter);  // 绘制拖动提示    // 几何计算
    qreal getOuterRadius() const;
    qreal getInnerRadius() const;
    qreal getCenterButtonRadius() const;
    qreal getDragAreaRadius() const;  // 添加拖动区域半径计算方法
    QPointF getCenter() const;
    QPainterPath getCenterButtonPath() const;
    QPainterPath getMenuItemPath(int index, bool useHoverState = false) const;
    QRectF getMenuItemRect(int index) const;
    qreal getItemAngle(int index) const;    qreal getStartRadian() const;
    QList<QPointF> getScatteredPositions(int itemCount) const;
    QList<QPointF> getCircularPositions(int itemCount) const;

private:
    // 基本属性
    bool m_isPopup;
    uint m_centerBtnSize;
    uint m_itemType;    bool m_isExpanded;
    qreal m_rotationAngle;
    qreal m_expandProgress;
    qreal m_gatherProgress;  // 新增聚集进度变量
    
    // 菜单数据
    QList<MenuItemData*> m_menuItems;
    MenuStyleConfig m_style;
    QString m_expandImgPath;
    QString m_closedImgPath;
    
    // 交互状态
    int m_hoveredItem;
    bool m_centerButtonHovered;
    bool m_isDragging;
    QPointF m_lastMousePos;
      // 动画
    QParallelAnimationGroup *m_menuAnimeGroup;
    QSequentialAnimationGroup *m_hoverAnimeGroup;
    QPropertyAnimation *m_rotationAnimation;
    QPropertyAnimation *m_expandAnimation;
    QPropertyAnimation *m_gatherAnimation;  // 聚集动画
    QTimer *m_rotationTimer;
    QTimer *m_waveTimer;
    
    // 高级效果功能
    void enableRippleEffect(bool enable = true);
    void enableGlowEffect(bool enable = true);
    void enableParticleEffect(bool enable = true);
    void setRippleColor(const QColor& color);
    void setGlowColor(const QColor& color);
};

#endif // ROUNDMENUWIDGET_H
